const basedata = require('./basedata')
const secret = require('./secret/')
const show = require('./show')
const copy = require('./copy')
const geopoint = require('./geopoint')
const regexp = require('./regexp')
const number = require('./number')
const equal = require('./equal')

/**
 * 前后端完全同步的工具类
 * type.js仅作为代码参考，实际前后端都没有有该文件的引用
 */
module.exports = {
	space: '　',
	
	basedata, secret,
	show, copy, geopoint,
	regexp, number, equal,
	
	/**
	 * 处理上传结果
	 * @param {Object} fileData 文件信息
	 * @param {Object} res 上传结果
	 * @param {Object} options 上传参数
	 */
	handleUploadResult(fileData, res, options) {
		if (options.fileURL) {
			fileData.cloudPath = options.cloudPath
			fileData.fileID = options.fileID
			fileData.url = options.fileURL
		} else {
			fileData.fileID = res.fileID
			if (fileData.fileID.startsWith(`cloud://`)) {
				const arr1 = fileData.fileID.split('://')
				const arr2 = arr1[1].split('/')
				var domin = arr2[0], path = ''
				arr2.shift()
				if (domin.startsWith('env-')) { // 支付宝云的情况
					path = '.normal.cloudstatic.cn/'
				} else if (domin.startsWith('tcb-')) { // 腾讯云的情况，好像是tcb-开头。需测试
					path = '.tcb.qcloud.la/'
				}
				fileData.url = 'https://' + domin + path + arr2.join('/')
			} else {
				fileData.url = fileData.fileID
			}
		}
	},
	
	/**
	 * 从有上级信息的一维数据列表中分离出从属关系，生成树形结构
	 * @param {Array} list 原始数据
	 * @param {Array} typeValue 从属关系的级别值。存在几项就取几项，第一项作为最外层，第二项作为第二层，以此类推
	 * @param {Array} keys 需要保留的其它字段
	 * @param {String} typeField 从属关系的级别字段。默认值type
	 * @param {Object} map 映射关系。默认值{text: 'name', value: 'code'}。如果不存在，就不执行映射，维持原数据不变
	 * @param {String} idField 当前信息字段。默认值code
	 * @param {String} parentField 上级信息字段。默认值parent_code
	 */
	getTreeList(list = [], typeValue = [2, 3], keys, typeField = 'type', map = {text: 'name', value: 'code'}, idField = 'code', parentField = 'parent_code') {
		var dataList = []
		if (map) {
			list.forEach(item => {
				var obj = {} // 仅保留几个必要的字段
				obj.text = item[map.text]
				obj.value = item[map.value]
				obj[idField] = item[idField]
				obj[typeField] = item[typeField]
				obj[parentField] = item[parentField]
				if (keys) {
					keys.forEach(key => {
						obj[key] = item[key]
					})
				}
				dataList.push(obj)
			})
		} else {
			dataList = list
		}
		typeValue.forEach((value, index) => {
			dataList.forEach(item => {
				if (item[typeField] === value) {
					const parent = dataList.find(parent => parent[idField] === item[parentField])
					if (parent) {
						if (!parent.children) {
							parent.children = []
						}
						parent.children.push(item)
					}
				}
			})
		})
		// 只保留第一层信息的数据
		return dataList.filter(item => item[typeField] === typeValue[0])
	}
}